from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
import time
'''
pip install pycryptodome
https://www.jb51.net/article/196942.htm
'''
def encrypt(s_key,text):
    '''
    s_key:秘钥，要求是str类型，并且长度必须是16、24或32 bytes，因为秘钥的长度可以为：128位、192位、256位
    '''
    # 参数key: 秘钥，要求是bytes类型，并且长度必须是16、24或32 bytes，因为秘钥的长度可以为：128位、192位、256位
    # 参数mode: 加密的模式，有ECB、CBC等等，最常用的是CBC
    # 参数iv: 初始向量，是CBC加密模式需要的初始向量，类似于加密算法中的盐
    # 创建用于加密的AES对象
    # data = pad(Bytes, 16)

    # 参数key: 秘钥，要求是bytes类型，并且长度必须是16、24或32 bytes，因为秘钥的长度可以为：128位、192位、256位
    key = s_key.encode()
    print(key)
    # 字符串补位
    # 使用对象进行加密，加密的时候，需要使用pad对数据进行填充，因为加密的数据要求必须是能被128整除
    data = pad(text.encode(encoding='utf-8'), 16, style='pkcs7')
    print(data)

    # 参数mode: 加密的模式，有ECB、CBC等等，最常用的是CBC
    cipher1 = AES.new(key, AES.MODE_ECB)
    en_text = cipher1.encrypt(data)
    print(en_text)

    encodestrs = base64.b64encode(en_text)
    # 使用Base64进行编码,返回byte字符串
    enctext = encodestrs.decode('utf8')
    # 对byte字符串按utf-8进行解码

    return enctext


def decrypt(s_key,text):
    # 参数key: 秘钥，要求是bytes类型，并且长度必须是16、24或32 bytes，因为秘钥的长度可以为：128位、192位、256位
    # 参数mode: 加密的模式，有ECB、CBC等等，最常用的是CBC
    # 参数iv: 初始向量，是CBC加密模式需要的初始向量，类似于加密算法中的盐
    # 创建用于加密的AES对象
    b_text = text.encode('utf-8')
    encodebytes = base64.decodebytes(b_text)
    # 将加密数据转换位bytes类型数据
    key = s_key.encode()
    print(key)

    # 创建用于解密的AES对象
    cipher2 = AES.new(key, AES.MODE_ECB)
    # 将十六进制的数据转换成二进制
    # hex_data = binascii.a2b_hex(ct_hex)
    # 解密完成后，需要对数据进行取消填充，获取原来的数据
    pt = unpad(cipher2.decrypt(encodebytes), 16)
    text_decrypted = pt.decode('utf8')
    return text_decrypted

if __name__ == '__main__':
    s_key = "D4RU5R8YhDebBHnG513nrSFft3DjFnDB"

    data = (str(int(time.time()*1000)))
    # data = str(1576141908794)
    print("原始数据：",data)
    enc_data = encrypt(s_key,data)
    print("加密后的数据：",enc_data)


    dec_data = decrypt(s_key,enc_data)
    print("解密后的数据：", dec_data)